"""
qq邮箱登录 - 滑块验证码
"""

from selenium import webdriver
from selenium.webdriver import ActionChains
import time

def get_tracks(distance):
    """
    拿到移动轨迹，模仿人的滑动行为，先匀加速后匀减速
    匀变速运动基本公式：
    ①v=v0+at
    ②s=v0t+½at²
    """
    # 初速度
    v = 0
    # 单位时间为0.3s来统计轨迹，轨迹即0.3内的位移
    t = 0.3
    # 位置/轨迹列表,列表内的一个元素代表0.3s的位移
    tracks = []
    # 当前的位移
    current = 0
    # 到达mid值开始减速
    mid = distance*4/5
    while current < distance:
        if current < mid:
            # 加速度越小,单位时间内的位移越小,模拟的轨迹就越多越详细
            a = 2
        else:
            a = -3
        # 初速度
        v0 = v
        # 0.3秒内的位移
        s = v0*t+0.5*a*(t**2)
        # 当前的位置
        current += s
        # 添加到轨迹列表
        tracks.append(round(s))
        # 速度已经达到v，该速度作为下次的初速度
        v = v0 + a*t

    return tracks
    # tracks: [第一个0.3秒的移动距离,第二个0.3秒的移动距离,...]

# 1.进入到qq邮箱登录页
driver = webdriver.Chrome()
driver.get(url='https://mail.qq.com/')
# 2.切换iframe
driver.switch_to.frame('login_frame')
# 3.定位节点: QQ号 密码
driver.find_element_by_id('u').send_keys('31415926')
driver.find_element_by_id('p').send_keys('123456')
driver.find_element_by_id('login_button').click()

time.sleep(2)
# 4.继续切换iframe到验证码子页面
driver.switch_to.frame("tcaptcha_iframe")
# 5.鼠标按住节点并保持
node = driver.find_element_by_id('tcaptcha_drag_button')
ActionChains(driver).click_and_hold(node).perform()
# 6.水平向右移动160个像素
ActionChains(driver).move_to_element_with_offset(node, xoffset=160, yoffset=0).perform()
# 7.利用加速度函数移动剩余的40个像素
tracks = get_tracks(40)
for track in tracks:
    ActionChains(driver).move_by_offset(xoffset=track, yoffset=0).perform()

# 8.延迟释放鼠标
time.sleep(0.5)
ActionChains(driver).release().perform()






































